-- Cheat Menu -  Cheat menu for Grand Theft Auto SanAndreas
-- Copyright (C) 2019-2020 Grinch_

-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.

-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.

-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

local module = {}

module.tmenu =
{	
	auto_update_check   = imgui.new.bool(fconfig.Get('tmenu.auto_update_check',true)),
	auto_reload 		= imgui.new.bool(fconfig.Get('tmenu.auto_reload',true)),
	command             = 
	{
		filter          = imgui.ImGuiTextFilter(),
		height          = 40,
		input_field     = imgui.new.char[256](),
		list            = {},
		show            = imgui.new.bool(false),
	},
	crash_text          = "",
	dont_save			= imgui.new.bool(fconfig.Get('tmenu.dont_save',false)),
	enable_stat_saving  = imgui.new.bool(fconfig.Get('tmenu.enable_stat_saving',false)),
	fast_load_images    = imgui.new.bool(fconfig.Get('tmenu.fast_load_images',true)),
	font				=
	{
		list			= {},
		selected		= fconfig.Get('tmenu.font.selected',"Trebucbd.ttf"),
		size  		    = imgui.new.int(fconfig.Get('tmenu.font.size',math.floor(resY/54.85))),
	},
	get_beta_updates	= imgui.new.bool(fconfig.Get('tmenu.get_beta_updates',true)),
	hot_keys     =
    {
        asc_key               = fconfig.Get('tmenu.hot_keys.asc_key',{vkeys.VK_RETURN,vkeys.VK_RETURN}),
        camera_mode           = fconfig.Get('tmenu.hot_keys.camera_mode',{vkeys.VK_LMENU,vkeys.VK_C}),
        camera_mode_forward   = fconfig.Get('tmenu.hot_keys.camera_mode_forward',{vkeys.VK_I,vkeys.VK_I}),
        camera_mode_backward  = fconfig.Get('tmenu.hot_keys.camera_mode_backward',{vkeys.VK_K,vkeys.VK_K}),
        camera_mode_left      = fconfig.Get('tmenu.hot_keys.camera_mode_left',{vkeys.VK_J,vkeys.VK_J}),
        camera_mode_right     = fconfig.Get('tmenu.hot_keys.camera_mode_right',{vkeys.VK_L,vkeys.VK_L}),
        camera_mode_slow      = fconfig.Get('tmenu.hot_keys.camera_mode_slow',{vkeys.VK_RCONTROL,vkeys.VK_RCONTROL}),
        camera_mode_fast      = fconfig.Get('tmenu.hot_keys.camera_mode_fast',{vkeys.VK_RSHIFT,vkeys.VK_RSHIFT}),
        camera_mode_up        = fconfig.Get('tmenu.hot_keys.camera_mode_up',{vkeys.VK_O,vkeys.VK_O}),
        camera_mode_down      = fconfig.Get('tmenu.hot_keys.camera_mode_down',{vkeys.VK_P,vkeys.VK_P}),
        command_window        = fconfig.Get('tmenu.hot_keys.command_window',{vkeys.VK_LMENU,vkeys.VK_M}),
        menu_open             = fconfig.Get('tmenu.hot_keys.menu_open',{vkeys.VK_LCONTROL,vkeys.VK_M}),
        quick_screenshot      = fconfig.Get('tmenu.hot_keys.quick_screenshot',{vkeys.VK_LCONTROL,vkeys.VK_S}),
        quick_teleport        = fconfig.Get('tmenu.hot_keys.quick_teleport',{vkeys.VK_X,vkeys.VK_Y}),
        script_manager_temp   = {vkeys.VK_LCONTROL,vkeys.VK_1}
    },
	lock_player   		= imgui.new.bool(fconfig.Get('tmenu.lock_player',false)),
	overlay             = 
	{
		coordinates     = imgui.new.bool(fconfig.Get('tmenu.overlay.coordinates',false)),
		fps             = imgui.new.bool(fconfig.Get('tmenu.overlay.fps',false)),
		show            = imgui.new.bool(true),
		location    	= imgui.new.bool(fconfig.Get('tmenu.overlay.location',false)),
    	position        = {"Custom","Top Left","Top Right","Bottom Left","Bottom Right"},
    	position_array  = {},
		position_index  = imgui.new.int(fconfig.Get('tmenu.overlay.position_index',4)),
		health          = imgui.new.bool(fconfig.Get('tmenu.overlay.health',false)),
		pos_x           = imgui.new.int(fconfig.Get('tmenu.overlay.pos_x',0)),
		pos_y           = imgui.new.int(fconfig.Get('tmenu.overlay.pos_y',0)),
		speed           = imgui.new.bool(fconfig.Get('tmenu.overlay.speed',false)),		
		transparent_bg  = imgui.new.bool(fconfig.Get('tmenu.overlay.transparent_bg',false)),
	},
	repo_version        = nil,
	show_tooltips	    = imgui.new.bool(fconfig.Get('tmenu.show_tooltips',true)),
	show_crash_message  = imgui.new.bool(fconfig.Get('tmenu.show_crash_message',true)),
	update_status       = fconst.UPDATE_STATUS.HIDE_MSG,
}

module.tmenu.overlay.position_array = imgui.new['const char*'][#module.tmenu.overlay.position](module.tmenu.overlay.position)

--------------------------------------------------
-- Command window

function module.FindArgument(t,string)
    for k,v in ipairs(t) do
        if v == string then
            return true
        end
    end
    return false
end

function module.RegisterCommand(string,call_back_func,desc,usage)
    module.tmenu.command.list[string] = {call_back_func,desc,usage}
end

function module.ExecuteCommand()

    local string = ffi.string(module.tmenu.command.input_field)
	local t = {}
	
    for w in string:gmatch("%S+") do 
        table.insert(t,w)
	end
	
	for v,k in pairs(module.tmenu.command.list) do
        if v == t[1] then
            k[1](t)
            return
        end
	end
end

function module.RegisterAllCommands()

	module.RegisterCommand("reload",function(t)
		thisScript():reload()
	end,"Reload cheat menu")

	module.RegisterCommand("reloadall",function(t)
		reloadScripts()
	end,"Reload all moonloader scripts")

	module.RegisterCommand("tp",function(t)
		if t[2] == nil or t[3] == nil then
			printHelpString("Required coordinate missing")
			return
		end

        if t[4] == nil then t[4] = getGroundZFor3dCoord(x,y,100) end
		lua_thread.create(fteleport.Teleport,tonumber(t[2]),tonumber(t[3]),tonumber(t[4]))
	end,"Teleport to coordinates","{int X} {int Y} {int Z}(optional)")
	
	module.RegisterCommand("settime",function(t)
        setTimeOfDay(t[2],t[3])
        printHelpString("Time set")
	end,"Sets in-game time","{int hour} {int minute}")
	
	module.RegisterCommand("cheatmenu",function(t)
        tcheatmenu.show[0] = not tcheatmenu.show[0]
    end,"Open or close cheat menu")

    module.RegisterCommand("sethealth",function(t)
       setCharHealth(PLAYER_PED,tonumber(t[2]))
       printHelpString("Set health to " .. t[2])
	end,"Sets player health to value","{int health}")
	
    module.RegisterCommand("setmaxhealth",function(t)
        setCharMaxHealth(PLAYER_PED,tonumber(t[2]))
        printHelpString("Set max health to " .. t[2])
	end,"Sets player max health to value","{int max_health}")
	
    module.RegisterCommand("copycoordinates",function(t)
        local x,y,z = getCharCoordinates(PLAYER_PED)
        setClipboardText(string.format("%s %s %s",math.floor(x),math.floor(y),math.floor(z)))
        printHelpString("Coordinates copied to clipboard")
    end,"Copies coordinates to clipboard")

    module.RegisterCommand("setcarspeed",function(t)
        if isCharInAnyCar(PLAYER_PED) then
            local car = getCarCharIsUsing(PLAYER_PED)
            setCarForwardSpeed(car,tonumber(t[2]))
            printHelpString("Car speed set to " ..t[2])
        else
            printHelpString("Player is not in any car")
        end
    end,"Sets vehicle speed","{int speed}")

    module.RegisterCommand("restorecam",function(t)
        restoreCamera()
	end,"Restores camera to default")

	module.RegisterCommand("cameramode",function(t)
		fgame.tgame.camera.bool[0] = not fgame.tgame.camera.bool[0]
		fcommon.CreateThread(fgame.CameraMode)
	end,"Enable or disable camera mode")
	
	module.RegisterCommand("veh",function(t)
		if t[2] == nil then 
			printHelpString("No vehicle name provided") 
			return 
		end

		local model = tonumber(t[2])

		if type(model) == "nil" then
			print(string.upper(t[2]))
			model = casts.CModelInfo.GetModelFromName(string.upper(t[2])) 

			if model ~= 0 and isModelAvailable(model) then  
				fvehicle.GiveVehicleToPlayer(model)
			else
				printHelpString("Invalid vehicle name")
			end
		end
		

	end,"Spawns vehicle","{vehicle name}")

    module.RegisterCommand("wep",function(t)
		if t[2] == nil then 
			printHelpString("No weapon name provided") 
			return 
		end

        local model = tonumber(t[2])

        if type(model) == "nil" then
            model = fweapon.CBaseWeaponInfo(string.upper(t[2]))  
            if model == 0 then  
                printHelpString("Invalid weapon name")
                return
            end
			t[2] = model
			fweapon.GiveWeapon(t[2])
        end
    end,"Spawns weapon","{weapon name}")
end
--------------------------------------------------
-- Updater code

function module.CheckUpdates()

	if fmenu.tmenu.get_beta_updates[0] then
		link = "https://raw.githubusercontent.com/user-grinch/Cheat-Menu/master/moonloader/cheat-menu.lua"
	else
		link = "https://api.github.com/repos/user-grinch/Cheat-Menu/tags"
	end

	downloadUrlToFile(link,string.format("%s/version.txt",tcheatmenu.dir),
	function(id, status, p1, p2)
		if status == fconst.UPDATE_STATUS.DOWNLOADED then
			local file_path = string.format("%s\\version.txt",tcheatmenu.dir)
			if doesFileExist(file_path) then
				local file = io.open(file_path,"rb")
				local content = file:read("*all")

				if fmenu.tmenu.get_beta_updates[0] then
					repo_version = content:match("script_version_number%((%d+)%)")
					this_version = script.this.version_num
				else
					repo_version = decodeJson(content)[1].name
					this_version = script.this.version
				end
	
				if repo_version ~= nil then
					if tostring(repo_version) > tostring(this_version) then
						module.tmenu.update_status = fconst.UPDATE_STATUS.NEW_UPDATE
						module.tmenu.repo_version = tostring(repo_version)
						printHelpString("New update available")
					else
						printHelpString("No update found")
					end
				else
					printHelpString("Couldn't connect to github. The rest of the menu is still functional. You can disable auto update check from 'Menu'")
				end
				io.close(file)
				os.remove(file_path)
			else
				print("Version.txt doesn't exist")
			end
		end
	end)
end

function module.DownloadUpdate()
	if fmenu.tmenu.get_beta_updates[0] then
		link = "https://github.com/user-grinch/Cheat-Menu/archive/master.zip"
	else
		link = "https://github.com/user-grinch/Cheat-Menu/archive/".. module.tmenu.repo_version .. ".zip"
	end

	downloadUrlToFile(link,string.format("%supdate.zip",tcheatmenu.dir),
	function(id, status, p1, p2)
		if status == fconst.UPDATE_STATUS.DOWNLOADED then
			fmenu.tmenu.update_status = fconst.UPDATE_STATUS.DOWNLOADED
			printHelpString("Download complete. Click the 'Install update' button to finish.")
		end
	end)
	
	printHelpString("Download has started. You'll get notified when the download completes.")
	module.tmenu.update_status = fconst.UPDATE_STATUS.DOWNLOADING
end

function module.InstallUpdate()
	fmenu.tmenu.update_status = fconst.UPDATE_STATUS.HIDE_MSG
	fgame.tgame.script_manager.skip_auto_reload = true
	ziplib.zip_extract(tcheatmenu.dir .. "update.zip",tcheatmenu.dir,nil,nil)
	
	local dir = tcheatmenu.dir

	if fmenu.tmenu.get_beta_updates[0] then
		dir = dir .. "\\Cheat-Menu-master\\"
	else
		dir = dir .. "\\Cheat-Menu-" .. fmenu.tmenu.repo_version .. "\\"
	end

	fcommon.MoveFiles(dir,getGameDirectory())
	
	os.remove(tcheatmenu.dir .. "update.zip")

	-- Delete the old config file too, causes crash?
	os.remove(string.format(tcheatmenu.dir .. "/json/config.json"))
	fconfig.tconfig.save_config = false

	printHelpString("Update ~g~Installed")
	print("Update installed. Reloading script.")
	thisScript():reload()
end

--------------------------------------------------

function module.MenuMain()

	if fcommon.BeginTabBar('MenuBar') then
		if fcommon.BeginTabItem('Config') then
			if imgui.Button("Reset to default",imgui.ImVec2(fcommon.GetSize(2))) then
				module.tmenu.crash_text = "Default configuration ~g~restored"
				fconfig.tconfig.reset = true
				thisScript():reload()
			end
			imgui.SameLine()
			if imgui.Button("Reload",imgui.ImVec2(fcommon.GetSize(2))) then
				module.tmenu.crash_text = "Cheat Menu ~g~reloaded"
				thisScript():reload()
			end
			imgui.Spacing()
			imgui.PushItemWidth((imgui.GetWindowContentRegionWidth()-imgui.GetStyle().ItemSpacing.x) * 0.50)
			fcommon.DropDownListStr("##Selectfont",fmenu.tmenu.font.list,"Font - " ..fmenu.tmenu.font.selected,
			function(key,val)
				imgui.GetIO().FontDefault = val
				fmenu.tmenu.font.selected = key
			end)
			imgui.SameLine()
			if imgui.SliderInt("##Fontsize", module.tmenu.font.size, 12, 48) then
				tcheatmenu.restart_required = true
			end
			imgui.PopItemWidth()
			imgui.Dummy(imgui.ImVec2(0,5))
			imgui.Columns(2,nil,false)
			fcommon.CheckBoxVar("Auto reload",module.tmenu.auto_reload,"Reload cheat menu automatically\nin case of a crash.\n\nMight cause crash loop sometimes.")
			fcommon.CheckBoxVar("Check for updates",module.tmenu.auto_update_check,"Cheat Menu will automatically check for updates\nonline. This requires an internet connection and\
will download files from github repository.")
			fcommon.CheckBoxVar("Don't save changes",module.tmenu.dont_save,"Don't save any changes done to the menu.\nMenu will always start as a new install.")
			fcommon.CheckBoxVar("Enable stat saving",module.tmenu.enable_stat_saving,"Save stats data in config file. These will be loaded\non new game start or save game load.\n\
Includes health, armour, stamina, body, fat etc.")
			fcommon.CheckBoxVar("Fast load images",module.tmenu.fast_load_images,"Loads images at the menu startup. Enabling this may\ndecrease fps loss when opening the image tabs but\
can freeze the game at startup for a few seconds.\n\nBest to enable if you won't reload the menu frequently.")
			imgui.NextColumn()
			fcommon.CheckBoxVar("Get beta updates",module.tmenu.get_beta_updates,"Receive frequent beta updates.\
These updates might be unstable.")
			fcommon.CheckBoxVar("Lock player",module.tmenu.lock_player,"Lock player controls while the menu is open")
			fcommon.CheckBoxVar("Show crash message",module.tmenu.show_crash_message)
			fcommon.CheckBoxVar("Show tooltips",module.tmenu.show_tooltips,"Shows usage tips beside options")
			imgui.Columns(1)
		end
		if fcommon.BeginTabItem('Overlay') then
			imgui.Columns(2,nil,false)
			fcommon.CheckBoxVar("No background",module.tmenu.overlay.transparent_bg)
			fcommon.CheckBoxVar("Show coordinates",module.tmenu.overlay.coordinates)
			fcommon.CheckBoxVar("Show FPS",module.tmenu.overlay.fps)	
			imgui.NextColumn()

			fcommon.CheckBoxVar("Show location",module.tmenu.overlay.location)
			fcommon.CheckBoxVar("Show vehicle health",module.tmenu.overlay.health)
			fcommon.CheckBoxVar("Show vehicle speed",module.tmenu.overlay.speed)
			imgui.Columns(1)

			imgui.Spacing()
			imgui.Combo("Position", module.tmenu.overlay.position_index,module.tmenu.overlay.position_array,#module.tmenu.overlay.position)
			fcommon.InformationTooltip("You can also right click on the\noverlay to access these options")
		end
		if fcommon.BeginTabItem('Commands') then
			module.tmenu.command.filter:Draw("Search")
			fcommon.InformationTooltip(string.format("Open command window using %s\nand close using Enter",fcommon.GetHotKeyNames(module.tmenu.hot_keys.command_window)))
			imgui.Spacing()

			if imgui.BeginChild("Command entries") then
				for v,k in fcommon.spairs(module.tmenu.command.list) do
					if module.tmenu.command.filter:PassFilter(v) and imgui.CollapsingHeader(v) then
						imgui.Spacing()
						if k[2] ~= nil then
							imgui.TextWrapped("Description: " .. k[2])
						end

						if k[3] == nil then k[3] = "" end
						imgui.TextWrapped("Usage: " .. v .. " " .. k[3])

						imgui.Separator()
					end
				end
				imgui.EndChild()
			end
		end
		if fcommon.BeginTabItem('Hotkeys') then
			local x,y = fcommon.GetSize(3)
			y = y/1.2
			
			fcommon.HotKey("Open/ close cheat menu",module.tmenu.hot_keys.menu_open)
			fcommon.HotKey("Open command window",module.tmenu.hot_keys.command_window)

			imgui.Dummy(imgui.ImVec2(0,10))

			fcommon.HotKey("Activate aim skin changer",module.tmenu.hot_keys.asc_key)
			fcommon.HotKey("Take quick screenshot",module.tmenu.hot_keys.quick_screenshot)
			fcommon.HotKey("Toggle quick teleport",module.tmenu.hot_keys.quick_teleport)

			imgui.Dummy(imgui.ImVec2(0,10))

			fcommon.HotKey("Enable/ disable camera mode",module.tmenu.hot_keys.camera_mode)
			fcommon.HotKey("Camera mode forward",module.tmenu.hot_keys.camera_mode_forward)
			fcommon.HotKey("Camera mode backward",module.tmenu.hot_keys.camera_mode_backward)
			fcommon.HotKey("Camera mode left",module.tmenu.hot_keys.camera_mode_left)
			fcommon.HotKey("Camera mode right",module.tmenu.hot_keys.camera_mode_right)
			fcommon.HotKey("Camera mode slower movement",module.tmenu.hot_keys.camera_mode_slow)
			fcommon.HotKey("Camera mode faster movement",module.tmenu.hot_keys.camera_mode_fast)
			fcommon.HotKey("Camera mode up (lock on player)",module.tmenu.hot_keys.camera_mode_up)
			fcommon.HotKey("Camera mode down (lock on player)",module.tmenu.hot_keys.camera_mode_down)
			imgui.Dummy(imgui.ImVec2(0,10))

			imgui.TextWrapped("You can reset these config to default from 'Reset to default' button under 'Config' tab")
		end
		if fcommon.BeginTabItem('Styles') then
			if fstyle.tstyle.status then
				if imgui.Button("Delete style",imgui.ImVec2(fcommon.GetSize(2))) then
					if fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1] == nil then
						printHelpString("No style selected")
					else
						if fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1] == "Default" then
							printHelpString("Can't delete default style")
						else
							fstyle.tstyle.styles_table[(fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1])] = nil
							fstyle.tstyle.list = fstyle.getStyles()
							fstyle.tstyle.array = imgui.new['const char*'][#fstyle.tstyle.list](fstyle.tstyle.list)
							fcommon.SaveJson("styles",fstyle.tstyle.styles_table)

							for k,v in ipairs(fstyle.tstyle.list) do
								if v == "Default" then
									fstyle.tstyle.selected[0] = k-1
								end
							end

							if fstyle.tstyle.list[fstyle.tstyle.selected[0]+1] == nil then
								fstyle.tstyle.selected[0] = fstyle.tstyle.selected[0] - 1
							end
							fstyle.applyStyle(imgui.GetStyle(), fstyle.tstyle.list[fstyle.tstyle.selected[0]+1])
							fstyle.tstyle.selected_name = fstyle.tstyle.list[fstyle.tstyle.selected[0]+1]
							printHelpString("Style deleted")
						end
					end
				end
				imgui.SameLine()
				if imgui.Button("Save style",imgui.ImVec2(fcommon.GetSize(2))) then
					fstyle.saveStyles(imgui.GetStyle(), ffi.string(fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1]))
					fstyle.tstyle.list  = fstyle.getStyles()
					fstyle.tstyle.array = imgui.new['const char*'][#fstyle.tstyle.list](fstyle.tstyle.list)
					fstyle.applyStyle(imgui.GetStyle(), fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1])
					fstyle.tstyle.selected_name = fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1]
					
					printHelpString("Style saved")
				end
			end

			imgui.Spacing()

			imgui.InputText('##styleName', fstyle.tstyle.name, ffi.sizeof(fstyle.tstyle.name) - 1) 
			imgui.SameLine()
			local vec_size = imgui.GetItemRectSize()
			local text = "Add style"
			vec_size.x = imgui.CalcTextSize(text).x+10
			if imgui.Button(text,vec_size) then
				fstyle.saveStyles(imgui.GetStyle(), ffi.string(fstyle.tstyle.name))
				fstyle.tstyle.list = fstyle.getStyles()
				fstyle.tstyle.array = imgui.new['const char*'][#fstyle.tstyle.list](fstyle.tstyle.list)
				for k,v in ipairs(fstyle.tstyle.list) do
					if v == ffi.string(fstyle.tstyle.name) then
						fstyle.tstyle.selected[0] = k-1
					end
				end
				fstyle.tstyle.selected_name = fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1]
				printHelpString("Style added")
			end

			if fstyle.tstyle.status then
				
				if imgui.Combo('Select style', fstyle.tstyle.selected, fstyle.tstyle.array, #fstyle.tstyle.list) then
					fstyle.applyStyle(imgui.GetStyle(), fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1])
					fstyle.tstyle.selected_name = fstyle.tstyle.list[fstyle.tstyle.selected[0] + 1]
				end
				
			 	fstyle.StyleEditor()
			end
		end
		if fcommon.BeginTabItem('License') then
			imgui.TextWrapped("This program is free software: you can redistribute it and/or modify it under the terms of the \z
			GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or \z
			(at your option) any later version. \n\n\z

			This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied \z
			warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. \n\n\z

			You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n\n\z

			Copyright (C) 2019-2020 Grinch_ \n")
		end
		if fcommon.BeginTabItem('About') then
			if imgui.Button("Check updates",imgui.ImVec2(fcommon.GetSize(3))) then
				module.CheckUpdates()
			end
			imgui.SameLine()
			if imgui.Button("Discord server",imgui.ImVec2(fcommon.GetSize(3))) then
				os.execute('explorer "https://discord.gg/ZzW7kmf"')
			end
			imgui.SameLine()
			if imgui.Button("GitHub repo",imgui.ImVec2(fcommon.GetSize(3))) then
				os.execute('explorer "https://github.com/user-grinch/Cheat-Menu"')
			end
			imgui.Spacing()

			if imgui.BeginChild("AboutChild") then

				imgui.Columns(2,nil,false)
				imgui.Text(string.format("%s v%s",script.this.name,script.this.version))
				imgui.Text(string.format("Build: %d",script.this.version_num))
	
				imgui.NextColumn()
				imgui.Text(string.format("Author: %s",script.this.authors[1]))
				imgui.Text(string.format("Imgui:   v%s",imgui._VERSION))
				imgui.Columns(1)

				imgui.TextWrapped("\nPlease provide 'moonloader.log' in case of debugging.")
				imgui.Dummy(imgui.ImVec2(0,10))
				imgui.TextWrapped("Special thanks to,")
				imgui.Columns(2,nil,false)
				
				imgui.TextWrapped("Dowglas_")
				imgui.TextWrapped("guru guru")
				imgui.TextWrapped("Israel")
				imgui.TextWrapped("Junior-Djjr")

				imgui.NextColumn()
				imgui.TextWrapped("randazz0")
				imgui.TextWrapped("Um_Geek")
				imgui.TextWrapped("Modding community")
				imgui.TextWrapped("Rockstar Games")
				imgui.EndChild()
			end
			imgui.Columns(1)
		end
		fcommon.EndTabBar()
	end
end

return module
